package com.adee.gulimall.gateway.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;

/**
 * 日志记录全局过滤器
 * 记录请求日志，用于监控、数据分析等
 *
 *
 * 网关常见功能：
 * 网关具有身份认证与安全、审查与监控、动态路由、负载均衡、缓存、请求分片与管理、静态响应
 * 处理等功能。当然最主要的职责还是与“外界联系”。
 * 　　总结一下，网关应当具备以下功能：
 * 性能：API 高可用，负载均衡，容错机制。
 * 安全：权限身份认证、脱敏，流量清洗，后端签名（保证全链路可信调用），黑名单（非法调用的
 * 限制）。
 * 日志：日志记录，一旦涉及分布式，全链路跟踪必不可少。
 * 缓存：数据缓存。
 * 监控：记录请求响应数据，API 耗时分析，性能监控。
 * 限流：流量控制，错峰流控，可以定义多种限流规则。
 * 灰度：线上灰度部署，可以减小风险。
 * 路由：动态路由规则。
 */
@Slf4j
@Component
public class Global_1_LogFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        NettyRoutingFilter f; // Integer.MAX_VALUE
//        ForwardRoutingFilter f1; // Integer.MAX_VALUE




        ServerHttpRequest request = exchange.getRequest();
        URI uri = request.getURI();
        log.info("uri:{}", uri);
        String userAgent = request.getHeaders().getFirst("User-Agent");
        log.info("User-Agent:{}", userAgent);


//        if(StringUtils.isEmpty(id)){
//            log.info("用户名不存在，非法请求！");
//            //如果username为空，返回状态码为407，需要代理身份验证
//            exchange.getResponse().setStatusCode(HttpStatus.PROXY_AUTHENTICATION_REQUIRED);
//            // 后置过滤器
//            return exchange.getResponse().setComplete();
//        }
        return chain.filter(exchange);
    }

    /**
     * 过滤器的优先级，数字越小优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return OrderNum.LogFilterOrder;
    }
}
